import fs from 'node:fs'
import Yaml from 'yaml'

// 输出插件加载开始信息
logger.info('奴隶市场载入中...')

// 创建必要的目录
fs.mkdirSync('plugins/Slave-Market/data/player', { recursive: true })
fs.mkdirSync('data/Ts-GameData', { recursive: true })

// 获取所有.js插件文件
const files = fs.readdirSync('./plugins/Slave-Market/apps').filter(file => file.endsWith('.js'))

// 默认配置对象
const defaultConfig = {
  buyBack: {
    cooldown: 86400,     // 回购冷却时间（秒）
    maxTimes: 3,         // 最大回购次数
    taxRate: 0.05        // 回购税率
  },
  rob: {
    cooldown: 600,       // 抢劫冷却时间（秒）
    successRate: 0.3,    // 抢劫成功率
    penalty: 0.1         // 抢劫失败惩罚
  },
  work: {
    cooldown: 3600,      // 工作冷却时间（秒）
    slaveownerCooldown: 60  // 奴隶主冷却时间（秒）
  },
  purchase: {
    cooldown: 3600       // 购买冷却时间（秒）
  },
  bank: {
    initialLimit: 1000,  // 初始银行限额
    initialLevel: 1,     // 初始等级
    upgradePriceMulti: 1.2,  // 升级价格倍数
    limitIncreaseMulti: 1.25, // 限额增长倍数
    initialUpgradePrice: 100,  // 初始升级价格
    interestRate: 0.01,      // 每小时利息率(1%)
    maxInterestTime: 24      // 最大计息时间(小时)
  },
  training: {
    cooldown: 7200,           // 训练冷却时间（秒）
    successRate: 0.7,         // 训练成功率
    costRate: 0.1,            // 训练费用比例（基于奴隶价值）
    valueIncreaseRate: 0.2    // 训练成功时价值提升比例
  },
  arena: {
    cooldown: 7200,          // 竞技冷却时间（秒）
    entryFee: 50,            // 参赛费用
    rewardRate: 0.2,         // 获胜奖励比例（基于参赛费用）
    valueBonus: 0.1          // 获胜者价值提升比例
  },
  ranking: {
    cooldown: 3600,          // 排位赛冷却时间（秒）
    baseReward: 10,          // 基础奖励金币
    winBonus: 0.2,           // 胜利额外奖励比例
    tierBonus: {             // 段位额外奖励
      '青铜': 1,
      '白银': 1.2,
      '黄金': 1.5,
      '铂金': 2,
      '钻石': 3
    }
  },
  transfer: {
    feeRate: 0.1,       // 手续费率
    minAmount: 100      // 最低转账金额
  },
  weeklyReset: {
    enabled: true,      // 是否启用每周重置
    resetTime: {        // 重置时间（周一00:00）
      day: 1,           // 星期一 (0=周日, 1=周一, ..., 6=周六)
      hour: 0,          // 小时 (0-23)
      minute: 0         // 分钟 (0-59)
    },
    preserveData: {     // 重置时保留的数据
      nickname: true,   // 保留昵称
      basicValue: 100   // 重置后的基础身价
    }
  }
}

/**
 * 检查并更新配置文件
 * 只添加缺失的新配置，不修改现有配置
 */
function updateConfig() {
  const configPath = 'config/SlaveMarket_config.yaml'
  let config = {}

  // 读取现有配置
  if (fs.existsSync(configPath)) {
    try {
      config = Yaml.parse(fs.readFileSync(configPath, 'utf8'))
    } catch (e) {
      logger.error('配置文件读取失败，将使用默认配置')
      config = JSON.parse(JSON.stringify(defaultConfig)) // 深拷贝默认配置
      fs.writeFileSync(configPath, Yaml.stringify(config)) // 立即写入修复后的配置
      logger.info('已创建新的配置文件')
    }
  } else {
    // 配置文件不存在时，使用默认配置并立即创建
    config = JSON.parse(JSON.stringify(defaultConfig)) // 深拷贝默认配置
    fs.writeFileSync(configPath, Yaml.stringify(config))
    logger.info('已创建初始配置文件')
    return // 直接返回，无需后续检查
  }

  // 递归检查并添加缺失的配置项
  let hasNewConfig = false
  const updateMissingConfig = (target, source) => {
    Object.entries(source).forEach(([key, value]) => {
      if (typeof value === 'object' && !Array.isArray(value)) {
        // 确保目标对象存在
        if (!target[key] || typeof target[key] !== 'object') {
          target[key] = {}
          hasNewConfig = true
          logger.info(`添加新配置组: ${key}`)
        }
        // 递归检查嵌套对象
        updateMissingConfig(target[key], value)
      } else if (!(key in target)) {
        // 添加缺失的配置项
        target[key] = value
        hasNewConfig = true
        logger.info(`添加新配置项: ${key}`)
      }
    })
  }

  // 检查并添加缺失的配置
  updateMissingConfig(config, defaultConfig)

  // 只有在发现新配置时才更新文件
  if (hasNewConfig) {
    try {
      fs.writeFileSync(configPath, Yaml.stringify(config))
      logger.info('配置文件已更新')
    } catch (e) {
      logger.error('配置文件更新失败:', e)
    }
  }
}

// 更新配置
updateConfig()

// 动态导入所有插件
const loadPlugins = async () => {
  const importPromises = files.map(file => import(`./apps/${file}`))
  const results = await Promise.allSettled(importPromises)

  // 处理导入结果
  const apps = {}
  results.forEach((result, index) => {
    const name = files[index].replace('.js', '')

    if (result.status === 'fulfilled') {
      apps[name] = result.value[Object.keys(result.value)[0]]
    } else {
      logger.error(`载入插件错误：${logger.red(name)}`)
      logger.error(result.reason)
    }
  })

  return apps
}

// 导出插件对象
export const apps = await loadPlugins()
logger.mark('奴隶市场载入成功')
